﻿/**
 * ExtJs 类型生成器，根据元数据和模板生成类型。
 */
Ext.define('Happy.metadata.ClassGenerator', {
    requires: [
        'Happy.metadata.Metadata',
        'Happy.metadata.CSharpTypeMapper',
        'Happy.metadata.template.DefineForm',
        'Happy.metadata.template.DefineGrid',
        'Happy.metadata.template.DefineModel',
        'Happy.metadata.template.DefineStore'
    ],

    /**
     * @readonly
     * @property {Happy.metadata.Metadata} metadata 元数据。
     */

    constructor: function (config) {
        var me = this;

        config = config || {};
        me.initialConfig = config;

        Ext.applyIf(me, {
            metadata: config.metadata
        });

        me.configTemplates();
    },

    /**
     * 配置模板。
     * 
     * @private
     */
    configTemplates: function () {
        var me = this;

        me.templates = Ext.Array.map(me.getTemplates(), function (template) {
            if (template instanceof Ext.Base) {
                return template;
            }

            if (Ext.isString(template)) {
                template = { type: template };
            }

            return Ext.createByAlias('template.' + template.type, template);
        });
    },

    /**
     * 返回模板数组。
     * 
     * @protect
     * @return {Array}
     */
    getTemplates: function () {
        return [
             'define-model',
             'define-store',
             'define-form',
             'define-grid'
        ];
    },

    /**
     * 执行模板。
     */
    generate: function () {
        var me = this;

        Ext.Array.each(me.templates, function (template) {
            template.generate(me, me.metadata);
        });
    }
});